﻿namespace T4UtilityBelt.DataDesigns
{
    public static class PropertyTypeInfoProvider
    {
        [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Performance", "CA1810:InitializeReferenceTypeStaticFieldsInline")]
        static PropertyTypeInfoProvider()
        {
            // http://msdn.microsoft.com/en-us/library/ms174642(v=sql.90).aspx

            _propertyTypes = new PropertyTypeInfoDictionary();

            Add(":Int16", "short", "1", "int", "1", "1");
            Add(":Int16?", "short?", "1", "int", "1", "1");

            Add(":Int32", "int", "1", "int", "1", "1");
            Add(":Int32?", "int?", "1", "int", "1", "1");

            Add(":Int64", "long", "1", "int", "1", "1");
            Add(":Int64?", "long?", "1", "int", "1", "1");

            Add(":Decimal", "decimal", "1", "DECIMAL", "1", "1");
            Add(":Decimal?", "decimal?", "1", "DECIMAL", "1", "1");

            Add(":Double", "double", "1", "REAL", "1", "1");
            Add(":Double?", "double?", "1", "REAL", "1", "1");

            Add(":Single", "single", "1", "FLOAT", "1", "1");
            Add(":Single?", "single?", "1", "FLOAT", "1", "1");

            Add(":String", "string", @"""aaa""", "NVARCHAR", @"""aaa""", @"""aaa""");
            //Add(":String?", "string", @"""aaa""", "NVARCHAR", @"""aaa""", @"""aaa""");

            Add(":DateTime", "DateTime", "DateTime.Now", "DATETIME", "", "2012-05-30T09:30:10Z");
            Add(":DateTime?", "DateTime?", "DateTime.Now", "DATETIME", "", "2012-05-30T09:30:10Z");

            //Add(":Date", "DateTime", "DateTime.Now", "DATETIME", "", "2012-05-30");
            //Add(":Date?", "DateTime?", "DateTime.Now", "DATETIME", "", "2012-05-30");

            Add(":Boolean", "bool", "true", "BIT", "1", "true");
            Add(":Boolean?", "bool?", "true", "BIT", "1", "true");

            Add(":Guid", "Guid", "00000000000100000000000101", "UNIQUEIDENTIFIER", "00000000000100000000000101", "00000000000100000000000101");
            Add(":Guid?", "Guid?", "00000000000100000000000101", "UNIQUEIDENTIFIER", "00000000000100000000000101", "00000000000100000000000101");
        }

        private static void Add(string name,
            string csType,
            string csTestData,
            string sqlType,
            string sqlTestData,
            string xmlTestData)
        {
            Add(new PropertyTypeInfo
                {
                Name = name,
                CsTestData = csTestData,
                CsType = csType,
                SqlType = sqlType,
                SqlTestData = sqlTestData,
                XmlTestData = xmlTestData
            });
        }

        private static void Add(PropertyTypeInfo type)
        {
            PropertyTypes.Add(type.CsType, type);
        }

        private static PropertyTypeInfoDictionary _propertyTypes;

        public static PropertyTypeInfoDictionary PropertyTypes
        {
            get
            {
                return _propertyTypes;
            }
        }
    }
}